package com.boodaba.todocarts.domain;

import java.util.ArrayList;
import java.util.List;

/**
 * Label is a container for To-Do items.
 */

public class Label extends DrivenByTitle<Label> implements IEntity<Label> {
	
	private List<Todo> mTodos;
		
	public Label(String title) {
		super(title);
		mTodos = new ArrayList<Todo>();
	}
	
	public Todo getTodoByTitle(String todoTitle) {
		TodoIdSpecification spec = new TodoIdSpecification(todoTitle);
		for (Todo todo : mTodos) {
			if (!spec.isSatisfiedBy(todo)) {
				continue;
			}
			return todo;
		}
		return null;
	}
	
	protected Todo getTodoBound(Todo todoItem) {
		if (mTodos.contains(todoItem)) {
			return todoItem;
		}
		
		for (Todo todo : mTodos) {
			if (!todo.identicalTo(todoItem)) {
				continue;
			}
			return todo;
		}
		
		return null;
	}
	
	public void inviteTodo(Todo todoItem) {
		if (todoItem == null) {
			return;
		}
		
		Todo boundTodo = this.getTodoBound(todoItem);
		
		if (boundTodo == null) {
			mTodos.add(todoItem);
			boundTodo = todoItem;
		}
		
		if (boundTodo.isCompleted()) {
			boundTodo.raise();
		}
	}
	
	public void inviteTodo(String todoTitle) {
		if (todoTitle == null
			|| todoTitle.trim().equals("")) {
			return;
		}
		inviteTodo(new Todo(todoTitle));
	}
	
	public void completeTodo(Todo todoItem) {
		Todo boundTodo = getTodoBound(todoItem);
		
		if (boundTodo != null) {
			boundTodo.complete();
		}
	}
	
	public void completeTodo(String todoTitle) {
		completeTodo(new Todo(todoTitle));
	}
	
	public void removeTodo(Todo todoItem) {
		Todo boundTodo = getTodoBound(todoItem);
		
		if (boundTodo != null) {
			mTodos.remove(boundTodo);
		}
	}
	
	public void removeTodo(String todoTitle) {
		removeTodo(new Todo(todoTitle));
	}
	
	public void replaceTodo(Todo oldTodo, Todo newTodo) {
		Todo oldFoundTodo = getTodoBound(oldTodo);
		Todo newFoundTodo = getTodoBound(newTodo);
		
		if (oldFoundTodo == null
			|| newFoundTodo != null
			|| newTodo == null) {
			return;
		}
		
		mTodos.remove(oldFoundTodo);
		mTodos.add(newTodo);
	}
	
	public void replaceTodo(String oldTodoTitle, String newTodoTitle) {
		replaceTodo(new Todo(oldTodoTitle), new Todo(newTodoTitle));
	}

	public List<Todo> getAllTodos() {
		return mTodos;
	}
	
	public List<Todo> getIncompletedTodos() {
		ArrayList<Todo> activeTodos = new ArrayList<Todo>();
		
		for (Todo todo : mTodos) {
			if (todo.isCompleted()) {
				continue;
			}
			activeTodos.add(todo);
		}
		
		return activeTodos;
	}
}
